<?php 

  class Mysmarty{
       
       private $tpl;  //接受模板内容
  	   private $vars=array();  //接受数目不定的变量，用数组接受。

  	  //创建构造方法验证各个目录是否存在
  	   public function __construct(){
  	 	 if(!is_dir(TPL_DIR)||!is_dir(TPL_C_DIR)||!is_dir(CACHE_DIR)){
  	 	 	  exit("ERROR:模板目录或编译目录或缓存目录不存在，请手工设置"); 	  
  	 	 }
  	  }

  	  //assign方法，注入变量
  	  public function assign($var,$val){
  	  	if(isset($var)&&!empty($var)){
  	  		 $this->vars[$var]=$val;  //注意成员变量使用是要去掉$;
  	  	}         
  	  }
    
      //parvar方法，解析变量
      private function parvar(){
      	  $pattern='/\{\$([\w]+)\}/';
      	  if(preg_match($pattern,$this->tpl)){
              $this->tpl=preg_replace($pattern,'<?php echo $this->vars["\\1"] ?>',$this->tpl);  //注意用单引号，防止$this->vars被解析
      	  }
      }
      
      //解析if语句
      private function parif(){
          $pattern='/\{if\s+\$([\w]+)\}/';
          $patternEnd='/\{\/if\}/';
          $patternElse='/\{else\}/';
          if(preg_match($pattern, $this->tpl)){
          	  if(preg_match($patternEnd, $this->tpl)){
                   $this->tpl=preg_replace($pattern, '<?php if($this->vars["\\1"]){?>', $this->tpl); 
                    $this->tpl=preg_replace($patternEnd,'<?php }?>', $this->tpl);
                   if(preg_match($patternElse, $this->tpl)){
                   	      $this->tpl=preg_replace($patternElse,'<?php }else{ ?>', $this->tpl);
                   }

          	  }else{
          	  	  exit('if语句没有正确关闭');
          	  }
          }
      }

      //解析foreach语句
      private function parforeach(){

      }

      //解析include语句
      private function parinclude(){
      	
      }

      //解析注释
      private function parcomment(){
      	$pattern='/\{\*([\w]+)\*\}/';
      	if(preg_match($pattern, $this->tpl))
      	      $this->tpl=preg_replace($pattern,'<!--\\1-->', $this->tpl);
      }





	  //display方法，编译模板
	  public function display($_file){
	  	  $tpl_file=TPL_DIR.$_file;
	  	  //判断模板文件是否存在
	  	  if(!file_exists($tpl_file)){
	           exit("ERROR:模板文件不存在");
	  	  }
	      //获取模板文件内容
	  	  $this->tpl=file_get_contents($tpl_file);

	      //生产编译文件,如果编译文件存在则不生成,不重复编译
	      $tpl_c_file=TPL_C_DIR.md5($_file).$_file.'.php';
	      if(!file_exists($tpl_c_file)||filemtime($tpl_c_file)<filemtime($tpl_file)){
               $this->parvar();  //解析动态变量
               $this->parif();   //解析if语句
               $this->parforeach(); //解析foreach语句
               $this->parinclude(); //解析include语句
               $this->parcomment(); //解析注释

	      	   file_put_contents($tpl_c_file, $this->tpl);
	      }	      
	      // //读取编译文件
	      include $tpl_c_file;
	   }

      
  }

 ?>